﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PlaylistGenEngine.VOs;
using WMPLib;
using System.Collections;
using System.IO;

namespace PlaylistGenerator_v1._0
{
    public partial class FormPlaylist : Form
    {
        #region Variáveis
        private Hashtable pastasDeArquivos;
        private Random random = new Random();
        #endregion

        #region Inicialização
        public FormPlaylist()
        {
            InitializeComponent();
            listPastas.DisplayMember = "nomeDaPasta";
            mediaPlayer.MediaChange += new AxWMPLib._WMPOCXEvents_MediaChangeEventHandler(trocaDeMusica);
            lblMusica.Text = "-";
        }
        #endregion

        #region Listeners
        private void btnAdicionaMusica_Click(object sender, EventArgs e)
        {
            inserePasta(listPastas, TipoPasta.MUSICA);
        }

        private void btnAdicionaComercial_Click(object sender, EventArgs e)
        {
            inserePasta(listPastas, TipoPasta.COMERCIAL);
        }

        private void listPastas_SelectedIndexChanged(object sender, EventArgs e)
        {
            validaBotaoRemove();
        }

        private void btnRemove_Click(object sender, EventArgs e)
        {
            removePasta(listPastas);
            validaPlayer();
        }

        private void btnIniciaPlayer_Click(object sender, EventArgs e)
        {
            btnIniciaPlayer.Enabled = false;
            btnStop.Enabled = true;
            List<Pasta> pastas = getPastasDoListBox(listPastas);
            registraPastas(pastas);
            montaPlaylist(pastas);
            mediaPlayer.Visible = true;
            mediaPlayer.Ctlcontrols.play();
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            btnIniciaPlayer.Enabled = true;
            btnStop.Enabled = false;
            mediaPlayer.Visible = false;
            mediaPlayer.Ctlcontrols.stop();
            lblMusica.Text = "-";
        }

        private void trocaDeMusica(object player, AxWMPLib._WMPOCXEvents_MediaChangeEvent evento)
        {
            lblMusica.Text = ((AxWMPLib.AxWindowsMediaPlayer)player).currentMedia.name;
        }
        #endregion

        #region Controles
        private void inserePasta(ListBox list, TipoPasta tipo)
        {
            folderDialog.ShowDialog();
            String path = folderDialog.SelectedPath;
            if (list.Items.Contains(path))
            {
                MessageBox.Show("A pasta \"" + path + "\" já existe na lista!");
            }
            else if (path.Length > 0)
            {
                Pasta pasta = new Pasta(path, tipo);
                list.Items.Add(pasta);
            }
            validaPlayer();
        }

        private void validaPlayer()
        {
            btnIniciaPlayer.Enabled = listPastas.Items.Count > 0;
            btnStop.Enabled = !btnIniciaPlayer.Enabled && listPastas.Items.Count > 0;
            if (!btnIniciaPlayer.Enabled)
            {
                mediaPlayer.Visible = false;
                mediaPlayer.Ctlcontrols.stop();
            }
        }

        private void validaBotaoRemove()
        {
            btnRemove.Enabled = listPastas.SelectedIndex > -1;
        }

        private void removePasta(ListBox list)
        {
            list.Items.Remove(list.SelectedItem);
        }
        #endregion

        #region Utilitários
        private List<Pasta> getPastasDoListBox(ListBox list)
        {
            List<Pasta> listaConvertida = new List<Pasta>();

            foreach (Pasta pasta in list.Items)
            {
                listaConvertida.Add(pasta);
            }

            return listaConvertida;
        }

        private void registraPastas(List<Pasta> pastas)
        {
            pastasDeArquivos = new Hashtable();
            foreach (Pasta pasta in pastas)
            {
                if (!pastasDeArquivos.ContainsKey(pasta))
                {
                    List<String> arquivos = recuperaArquivos(pasta);
                    pastasDeArquivos.Add(pasta, arquivos);
                }
            }
        }

        private List<String> recuperaArquivos(Pasta pasta)
        {
            List<String> arquivos = new List<String>();
            foreach (String arquivo in Directory.GetFiles(pasta.FolderPath))
            {
                arquivos.Add(arquivo);
            }
            return arquivos;
        }

        private String getArquivo(Pasta pasta)
        {
            String arquivo = "";
            List<String> arquivos = (List<String>)pastasDeArquivos[pasta];
            if (arquivos.Count > 0)
            {
                arquivo = arquivos[random.Next(0, arquivos.Count - 1)];
                if (pasta.Tipo.Equals(TipoPasta.MUSICA))
                {
                    arquivos.Remove(arquivo);
                }
            }
            else
            {
                pastasDeArquivos.Remove(pasta);
                pastasDeArquivos.Add(pasta, recuperaArquivos(pasta));
                arquivo = getArquivo(pasta);
            }
            return arquivo;
        }

        private void montaPlaylist(List<Pasta> pastas)
        {
            mediaPlayer.currentPlaylist.clear();
            for (int i = 0; i < 10; i++)
            {
                IWMPPlaylist list = mediaPlayer.currentPlaylist;
                foreach (Pasta pasta in pastas)
                {
                    IWMPMedia media = mediaPlayer.newMedia(getArquivo(pasta));
                    list.appendItem(media);
                }
            }
        }
        #endregion
    }
}
